package cn.edu.zufe.mjt.spinrg.web;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;

import java.io.File;
import java.io.IOException;

/**
 * @author 蒙锦涛
 * @date 2025/4/30
 * @description 这个类是用来演示如何在Spring Boot中嵌入Tomcat服务器的。
 */


public class EmbeddedTomcatDemo {

    /**
     * 主程序入口
     * 本程序通过嵌入式Tomcat服务器，在指定端口上部署一个简单的Servlet
     * 该Servlet响应所有GET请求，返回一个简单的HTML页面
     *
     * @param args 命令行参数，本程序不使用此参数
     * @throws LifecycleException 当Tomcat服务器启动或停止过程中发生错误
     */
    public static void main(String[] args) throws LifecycleException {
        // 定义Tomcat服务器监听的端口
        int port = 8080;
        // 创建Tomcat服务器实例
        Tomcat tomcat = new Tomcat();
        // 设置Tomcat服务器的监听端口
        tomcat.setPort(port);
        // 获取Tomcat服务器的连接器信息，此处未使用返回值，可能是为了触发内部初始化
        tomcat.getConnector();

        // 定义上下文路径为空，表示默认上下文
        String contextPath = "";
        // 获取当前目录的绝对路径，作为Web应用的文档基础路径
        String docBase = new File(".").getAbsolutePath();
        // 向Tomcat服务器添加一个上下文，返回值是新添加的上下文实例
        Context context = tomcat.addContext(contextPath, docBase);

        // 向指定上下文路径添加一个Servlet，标识为"helloServlet"
        // 这个Servlet重写了doGet方法，响应所有GET请求
        tomcat.addServlet(contextPath, "helloServlet", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                // 设置响应内容类型为HTML，字符集为UTF-8
                resp.setContentType("text/html;charset=UTF-8");
                // 写入响应内容，包含一个简单的HTML页面和请求的URL
                resp.getWriter().write("<h1>Hello, Spring Boot Embedded Tomcat!</h1> <br>" + req.getRequestURL().toString());
            }
        });
        // 将"helloServlet"映射到上下文的根路径，拦截所有请求
        context.addServletMappingDecoded("/*", "helloServlet");

        // 启动Tomcat服务器
        tomcat.start();
        // 打印Tomcat服务器启动信息，包括监听的端口
        System.out.println("Tomcat started on port " + port);
    }
}
